﻿// Inner Fire 游戏引擎库
// AnimationChannel - 动画通道
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于保存一个动画序列中的一个通道。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-03-17

#pragma once

#include <DirectXMath.h>
#include <assimp/scene.h>
#include <memory>
#include <static_string.h>

namespace ifire::game {
class AnimationClip;

struct AnimationVector {
  float time;
  DirectX::XMFLOAT3 value;

  AnimationVector(float anime_time, DirectX::XMFLOAT3 anime_value)
      : time(anime_time), value(anime_value) {}
  // 对项目进行插值，返回一个可供运算的项目
  DirectX::XMVECTOR Interpolate(const AnimationVector& end, float factor) const;
  // 直接返回可运算值
  inline DirectX::XMVECTOR GetValue() const { return XMLoadFloat3(&value); }
};

struct AnimationQuaternion {
  float time;
  DirectX::XMFLOAT4 value;

  AnimationQuaternion(float anime_time, DirectX::XMFLOAT4 anime_value);
  // 对项目进行插值，返回一个可供运算的项目
  DirectX::XMVECTOR Interpolate(
      const AnimationQuaternion& end, float factor) const;
  inline DirectX::XMVECTOR GetValue() const { return XMLoadFloat4(&value); }
};

struct AnimationChannel {
public:
  ikit::sstr name;
  eastl::vector<AnimationVector> position_keys;
  eastl::vector<AnimationQuaternion> rotation_keys;
  eastl::vector<AnimationVector> scale_keys;

  AnimationChannel(AnimationClip* parent, ikit::sstr node_name);
  DirectX::XMMATRIX CalcTransform(float frame) const;

private:
  DirectX::XMVECTOR CalcInterpolatedPosition(float frame) const;
  DirectX::XMVECTOR CalcInterpolatedRotation(float frame) const;
  DirectX::XMVECTOR CalcInterpolatedScaling(float frame) const;
  AnimationClip* parent_;
};

} // namespace ifire::game